package proyecto.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import javax.sql.DataSource;
import proyecto.excepcion.DAOExcepcion;
import proyecto.modelo.Ficha;
import proyecto.modelo.Ficha_Medica;

public class FichaDAOImpl extends BaseDAO implements FichaDAO {

    private DataSource dataSource;

    public DataSource getDataSource() {
        return dataSource;
    }

    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    public Collection<Ficha_Medica> listar() throws DAOExcepcion {
        Collection<Ficha_Medica> c = new ArrayList<Ficha_Medica>();
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = dataSource.getConnection();
            String query = "select f.id_ficha_medica,f.fec_registro,p.nombres,p.apellidos,d.descripcion from tb_ficha_medica f inner join tb_paciente p inner join tb_detalle_ficha_analisis fa inner join tb_analisis d where f.id_paciente=p.id_paciente and f.id_ficha_medica=fa.id_ficha_medica and fa.id_analisis=d.id_analisis order by f.id_ficha_medica";
            stmt = con.prepareStatement(query);
            rs = stmt.executeQuery();
            while (rs.next()) {
                Ficha_Medica vo = new Ficha_Medica();
                vo.setId_ficha_medica(rs.getInt("f.id_ficha_medica"));
                vo.setPaciente(rs.getString("p.nombres") + " " + rs.getString("p.apellidos"));
                vo.setFec_registro(rs.getDate("f.fec_registro"));
                vo.setDes_analisis(rs.getString("d.descripcion"));
                c.add(vo);
            }

        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(rs);
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
        return c;
    }

    public Collection<Ficha> buscarFichaPorIdPaciente(int idPaciente) throws DAOExcepcion {
        String query = "SELECT * FROM tb_ficha_medica where id_paciente = ?";
        Collection<Ficha> lista = new ArrayList<Ficha>();
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setInt(1, idPaciente);
            rs = stmt.executeQuery();
            while (rs.next()) {
                Ficha vo = new Ficha();
                vo.setId_ficha_medica(rs.getInt("id_ficha_medica"));
                vo.setEstado(rs.getString("estado"));
                vo.setFec_registro(rs.getString("fec_registro"));
                vo.setId_medico(rs.getInt("id_medico"));
                vo.setId_paciente(rs.getInt("id_paciente"));
                lista.add(vo);
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(rs);
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
        System.out.println(lista.size());
        return lista;
    }

    public Ficha_Medica insertar(Ficha_Medica vo) throws DAOExcepcion {
        String query = "INSERT INTO tb_ficha_medica(estado,fec_registro,id_medico,id_paciente) VALUES (?,now(),?,?)";
        System.out.println("Llego aquiiiiiiiiiiiiiiiiiiiiiii");
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setString(1, "Abierto");
            stmt.setString(2, "1");
            stmt.setString(3, vo.getPaciente());
            int i = stmt.executeUpdate();
            if (i != 1) {
                throw new SQLException("No se pudo insertar");
            }
            // Obtener el ultimo id
            
            int id = 0;
            query = "SELECT LAST_INSERT_ID()";
            stmt = con.prepareStatement(query);
            rs = stmt.executeQuery();
            if (rs.next()) {
                id = rs.getInt(1);
            }
            vo.setId_ficha_medica(id);

        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(rs);
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }


        query="insert into tb_detalle_ficha_analisis values(?,?,?)";
        con=null;
        stmt=null;
        rs=null;

         try {
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setInt(1,vo.getId_ficha_medica());
            stmt.setInt(2, vo.getId_analisis());
            stmt.setInt(3,1);
            int i = stmt.executeUpdate();
            if (i != 1) {
                throw new SQLException("No se pudo insertar");
            }

        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(rs);
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }


        query="insert into tb_detalle_ficha_muestra values(?,?,?)";
        con=null;
        stmt=null;
        rs=null;

         try {
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setInt(1,vo.getId_ficha_medica());
            stmt.setInt(2, vo.getId_muestra());
            stmt.setString(3,vo.getObservacion());
            int i = stmt.executeUpdate();
            if (i != 1) {
                throw new SQLException("No se pudo insertar");
            }

        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(rs);
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }


        return vo;
    }


    public void eliminar(int idficha) throws DAOExcepcion {

        String query="DELETE FROM tb_resultado WHERE id_ficha_medica=?";
        Connection con = null;
        PreparedStatement stmt = null;
        try {
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setInt(1, idficha);
            int i = stmt.executeUpdate();
            if (i == 0) {
                throw new SQLException("No se pudo eliminar detalle resultado");
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
        query="DELETE FROM tb_detalle_ficha_analisis WHERE id_ficha_medica=?";
        con=null;
        stmt = null;
        try {
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setInt(1, idficha);
            int i = stmt.executeUpdate();
            if (i == 0) {
                throw new SQLException("No se pudo eliminar detalle analisis");
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }

        query="DELETE FROM tb_detalle_ficha_muestra WHERE id_ficha_medica=?";
        con=null;
        stmt = null;

        try {
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setInt(1, idficha);
            int i = stmt.executeUpdate();
            if (i == 0) {
                throw new SQLException("No se pudo eliminar detalle muestra");
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }

        query="DELETE FROM tb_ficha_medica WHERE id_ficha_medica=?";
        con=null;
        stmt = null;
        try {
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setInt(1, idficha);
            int i = stmt.executeUpdate();
            if (i == 0) {
                throw new SQLException("No se pudo eliminar");
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }

    }
}

